import { loadEnv, Plugin, UserConfig } from 'vite';
import { getLocalIP } from './utils';
import chalk from 'chalk';

const logger = console;

export interface RegisterOptions {
    serverList: string;
    /** 服务名称（如 'main-app'） */
    serviceName: string;
    /** 服务端口号 */
    port: number;
    /** 命名空间（用于环境隔离，默认 'public'） */
    namespace?: string;
}

export function reg(options?: Partial<RegisterOptions>): Plugin {
    return {
        name: 'vite-plugin-nacos',
        async config(config: UserConfig, { mode }) {
            // 修改base，增加资源来源地址，修复资源错误加载的问题
            const env = loadEnv(mode, process.cwd());
            let baseUrl = ""

            // 主模块 main-app 不加 base 前缀，其他模块都加，
            // 也是为了命中 traefik 路由代理
            if (env.VITE_SERVER_NAME != "main-app") {
                baseUrl = `${env.VITE_SERVER_NAME}/`
            }

            return {
                server: {
                    allowedHosts: [
                        '.ddd.com',
                    ],
                    port: Number(env.VITE_SERVER_PORT),
                    host: '::',
                    strictPort: true,
                    cors: true
                },
                // base: `${env.VITE_PREFIX}${getLocalIP()}:${env.VITE_SERVER_PORT}/${baseUrl}`
                base: `/${baseUrl}`
            };
        },
        async configResolved(config) {
            const env = config.env;
        },
        async closeBundle() {
            // // 服务关闭时注销Nacos实例
            // if (nacosInstance) {
            //     await nacosInstance.destroy();
            // }
        },
    }
}

function Logs(env: Record<string, any>) {
    const moduleName = []
    for (const key in env) {
        if (key.includes("VITE_MODEL_")) {
            moduleName.push(env[key]);
        }
    }
    moduleName.length == 0 ? moduleName.push('无') : null
    const webUI = env.VITE_NACOS_ADDRESS.split(":")[0]
    console.log()

    console.log(dedentTemplateString(`
               ${chalk.blue.bold('微服务工具：')}
                ${chalk.green('➜')} Naco 配置中心： ${env.VITE_PREFIX}${env.VITE_NACOS_ADDRESS}
                  ${chalk.green('➜')} WebUi： ${env.VITE_PREFIX}${webUI}:8085
                ${chalk.green('➜')} Prometheus 监控： ${env.VITE_PREFIX}${webUI}:9090   
                ${chalk.green('➜')} Grafana 面板： ${env.VITE_PREFIX}${webUI}:3000     
                ${chalk.green('➜')} Traefik 网关： ${env.VITE_PREFIX}${env.VITE_TRAEFIK_ADDRESS}
                  ${chalk.green('➜')} WebUi： ${env.VITE_PREFIX}${env.VITE_TRAEFIK_ADDRESS}:8880
               
               ${chalk.blue.bold('微前端信息：')}
                ${chalk.green('➜')} 主模块：${chalk.green(env.VITE_SERVER_NAME)}
               
               ${chalk.blue.bold('调用模块：')}
                ${chalk.green('➜')} [ ${chalk.yellow(moduleName)} ]
            `))
    console.log()
}

function dedentTemplateString(str: string) {
    // 分割成行
    const lines = str.split('\n');

    // 移除首尾空行
    if (lines[0].trim() === '') lines.shift();
    if (lines[lines.length - 1].trim() === '') lines.pop();

    // 找到最小缩进量
    const minIndent = lines.reduce((min, line) => {
        if (line.trim() === '') return min; // 跳过空行
        // @ts-ignore
        const indent = line.match(/^\s*/)[0].length;
        return indent < min ? indent : min;
    }, Infinity);

    // 移除统一缩进
    return lines.map(line => line.slice(minIndent)).join('\n');
}